home *** CD-ROM | disk | FTP | other *** search
/ The Games Machine 165 / XENIATGM165.ISO / Goodies / Toca Race Driver Etoy / racedriver-etoy.exe / race_downloadable.dcr / Internal_82_background drawing object.ls < prev    next >
Encoding:
Text File  |  2002-08-16  |  8.5 KB  |  245 lines

  1. property levelRect, levelLimits, levelSize, srcImage, destrect, screenrect, screensize, halfscreenSize, origin, scrollMember, initialised, startpos, trackMap, leveldata, startAngle, pCollisionGrid, pTrackSpline, pTotalLaps, pSpriteChannel, pLastSprite, pickups, pCurrentPickupNum
  2. global gOffscreen
  3.  
  4. on new me
  5.   scrollMember = member("one size pixel")
  6.   screensize = point(520, 320)
  7.   destrect = rect(point(0, 0), screensize)
  8.   halfscreenSize = screensize / 2.0
  9.   scrollMember.image = image(screensize.locH, screensize.locV, 32)
  10.   pSpriteChannel = 100
  11.   pLastSprite = pSpriteChannel + 150
  12.   i = pSpriteChannel
  13.   repeat while i <= (pLastSprite - 10)
  14.     sprite(i).puppet = 1
  15.     sprite(i).loc = gOffscreen
  16.     sprite(i).foreColor = 255
  17.     sprite(i).backColor = 0
  18.     sprite(i).ink = 8
  19.     i = 1 + i
  20.   end repeat
  21.   return me
  22. end
  23.  
  24. on initLevel me
  25.   leveldata = script("track_data").getleveldata()
  26.   pTotalLaps = leveldata[#numberLaps]
  27.   srcImage = member("track", "tracks").image
  28.   trackMap = member("trackmap", "tracks").image
  29.   startpos = leveldata[#checkpoints][1][#loc]
  30.   startAngle = leveldata[#checkpoints][1][#angle]
  31.   levelSize = point(srcImage.width, srcImage.height)
  32.   levelRect = rect(point(0, 0), levelSize)
  33.   levelLimits = rect(point(0, 0), levelSize - screensize)
  34.   initialised = 0
  35.   origin = (levelSize / 2.0) - halfscreenSize
  36.   pCollisionGrid = script("collision grid").new(levelSize, point(200, 200))
  37.   i = 1
  38.   repeat while i <= leveldata[#checkpoints].count
  39.     checkPoint = leveldata[#checkpoints][i]
  40.     checkPoint[#number] = i
  41.     pCollisionGrid.addItem(#checkpoints, checkPoint[#pRect], checkPoint)
  42.     i = 1 + i
  43.   end repeat
  44.   pTrackSpline = script("catmull rom spline").new()
  45.   i = 1
  46.   repeat while i <= leveldata[#splinepoints].count
  47.     waypoint = leveldata[#splinepoints][i]
  48.     waypoint[#number] = i
  49.     pTrackSpline.addPoint(i, waypoint[#ploc], waypoint[#pDistance])
  50.     i = 1 + i
  51.   end repeat
  52.   pTrackSpline.calcStats()
  53.   leftbarrier = [#start: point(0, -20), #end: point(0, levelRect.bottom + 20), #normals: [point(1.0, 0.0), point(-1.0, 0.0)]]
  54.   me.createBarrierRect(leftbarrier)
  55.   leveldata[#barriers].add(leftbarrier)
  56.   rightbarrier = [#start: point(levelRect.right - 1, -20), #end: point(levelRect.right - 1, levelRect.bottom + 20), #normals: [point(-1.0, 0.0), point(1.0, 0.0)]]
  57.   me.createBarrierRect(rightbarrier)
  58.   leveldata[#barriers].add(rightbarrier)
  59.   topbarrier = [#start: point(-20, 1), #end: point(levelRect.right + 20, 1), #normals: [point(0.0, 1.0), point(0.0, -1.0)]]
  60.   me.createBarrierRect(topbarrier)
  61.   leveldata[#barriers].add(topbarrier)
  62.   bottombarrier = [#start: point(-20, levelRect.bottom - 1), #end: point(levelRect.right + 20, levelRect.bottom - 1), #normals: [point(0.0, -1.0), point(0.0, 1.0)]]
  63.   me.createBarrierRect(bottombarrier)
  64.   leveldata[#barriers].add(bottombarrier)
  65.   i = 1
  66.   repeat while i <= leveldata[#barriers].count
  67.     barrier = leveldata[#barriers][i]
  68.     barrierRect = barrier[#rect]
  69.     me.addBarrierToCollisionGrid(barrier)
  70.     i = 1 + i
  71.   end repeat
  72.   lastObstacleSprite = pLastSprite - 10
  73.   i = pSpriteChannel
  74.   repeat while i <= lastObstacleSprite
  75.     sprite(i).ink = 8
  76.     i = 1 + i
  77.   end repeat
  78.   i = 1
  79.   repeat while i <= leveldata[#obstacles].count
  80.     obstacle = leveldata[#obstacles][i]
  81.     obstacle[#pRadius] = max(obstacle[#pRect].width, obstacle[#pRect].height) / 2
  82.     obstacle[#pOldLoc] = obstacle[#ploc]
  83.     obstacle[#pRect] = rect(obstacle[#ploc] - obstacle[#pRadius], obstacle[#ploc] + obstacle[#pRadius])
  84.     obstacle[#pVelocity] = point(0.0, 0.0)
  85.     pCollisionGrid.addItem(#obstacles, obstacle[#pRect], obstacle)
  86.     i = 1 + i
  87.   end repeat
  88.   pickups = []
  89.   numPIckups = 0
  90.   diff = min(5, (pTrackSpline.numPoints - numPIckups) / 2)
  91.   pickuplocs = []
  92.   i = 1
  93.   repeat while i <= numPIckups
  94.     newpos = diff + random(pTrackSpline.numPoints - diff)
  95.     repeat while pickuplocs.getPos(newpos) > 0
  96.       newpos = diff + random(pTrackSpline.numPoints - diff)
  97.     end repeat
  98.     pickuplocs[i] = newpos
  99.     i = 1 + i
  100.   end repeat
  101.   maxPickupType = max(1, (3 * numPIckups / 4) - 1)
  102.   pickuptypes = []
  103.   numpickuptypes = [0, 0]
  104.   i = 1
  105.   repeat while i <= numPIckups
  106.     pickuptype = 1
  107.     pickuptype = random(2)
  108.     repeat while numpickuptypes[pickuptype] > maxPickupType
  109.       pickuptype = random(2)
  110.     end repeat
  111.     numpickuptypes[pickuptype] = numpickuptypes[pickuptype] + 1
  112.     pickuptypes.add(pickuptype)
  113.     i = 1 + i
  114.   end repeat
  115.   i = 1
  116.   repeat while i <= numPIckups
  117.     pickupdata = [#type: pickuptypes[i], #ploc: pTrackSpline.pointList[pickuplocs[i]]]
  118.     pickupdata[#pRect] = rect(pickupdata.ploc - point(15, 15), pickupdata.ploc + point(15, 15))
  119.     pickups.add(pickupdata)
  120.     i = 1 + i
  121.   end repeat
  122. end
  123.  
  124. on deletePickup me, pickupnum
  125.   if pickupnum <= pickups.count then
  126.     pickups.deleteAt(pickupnum)
  127.   end if
  128. end
  129.  
  130. on addBarrierToCollisionGrid me, barrier
  131.   global gLineCollisionTime
  132.   pCollisionGrid.addItem(#barriers, barrier[#rect], barrier)
  133. end
  134.  
  135. on createBarrierRect me, thebarrier
  136.   newRect = rect(thebarrier.start, thebarrier.end)
  137.   if newRect.width <= 1 then
  138.     newRect[1] = newRect[1] - 1
  139.     newRect[3] = newRect[3] + 1
  140.   end if
  141.   if newRect.height <= 1 then
  142.     newRect[2] = newRect[2] - 1
  143.     newRect[4] = newRect[4] + 1
  144.   end if
  145.   thebarrier[#rect] = newRect
  146. end
  147.  
  148. on getCoursePixel me, loc
  149.   halfloc = loc / 2
  150.   if halfloc.inside(levelRect / 2) then
  151.     return trackMap.getPixel(halfloc, #integer)
  152.   else
  153.     return 128
  154.   end if
  155. end
  156.  
  157. on draw me, destinationPos
  158.   if destinationPos.locH < levelLimits.left then
  159.     destinationPos.locH = levelLimits.left
  160.   end if
  161.   if destinationPos.locH > levelLimits.right then
  162.     destinationPos.locH = levelLimits.right
  163.   end if
  164.   if destinationPos.locV < levelLimits.top then
  165.     destinationPos.locV = levelLimits.top
  166.   end if
  167.   if destinationPos.locV > levelLimits.bottom then
  168.     destinationPos.locV = levelLimits.bottom
  169.   end if
  170.   if not initialised then
  171.     initialised = 1
  172.     origin = destinationPos
  173.   else
  174.     if origin <> destinationPos then
  175.       maxcameraSpeed = 35
  176.       maxcameraSpeed = 60
  177.       springDiff = (destinationPos - origin) * 0.40000000000000002
  178.       speedSqr = dotProduct(springDiff, springDiff)
  179.       if speedSqr > (maxcameraSpeed * maxcameraSpeed) then
  180.         springDiff = maxcameraSpeed * (springDiff / sqrt(speedSqr))
  181.       end if
  182.       origin = origin + springDiff
  183.     end if
  184.   end if
  185.   screenrect = rect(point(0, 0), screensize) + rect(origin, origin)
  186.   scrollMember.image.copyPixels(srcImage, destrect, screenrect)
  187.   currentSpriteChannel = pSpriteChannel
  188.   if pickups.count then
  189.     i = 1
  190.     repeat while i <= min(pickups.count, 2)
  191.       set the loc of sprite currentSpriteChannel to pickups[i][#ploc] - origin
  192.       if pickups[i][#type] = 1 then
  193.         set the member of sprite currentSpriteChannel to member("grass")
  194.       else
  195.         set the member of sprite currentSpriteChannel to member("speedup")
  196.       end if
  197.       currentSpriteChannel = currentSpriteChannel + 1
  198.       i = 1 + i
  199.     end repeat
  200.   end if
  201.   if currentSpriteChannel < (pSpriteChannel + 2) then
  202.     i = currentSpriteChannel
  203.     repeat while i <= (pSpriteChannel + 2)
  204.       set the loc of sprite i to gOffscreen
  205.       i = 1 + i
  206.     end repeat
  207.   end if
  208.   obstacleList = pCollisionGrid.getItems(#obstacles, screenrect)
  209.   currentSpriteChannel = pSpriteChannel + 2
  210.   obstaclestart = currentSpriteChannel
  211.   lastObstacleSprite = pLastSprite - 10
  212.   repeat with obstacle in obstacleList
  213.     if currentSpriteChannel <= lastObstacleSprite then
  214.       set the loc of sprite currentSpriteChannel to obstacle.ploc - origin
  215.       set the member of sprite currentSpriteChannel to member(obstacle.ptype, "tracks")
  216.       sprite(currentSpriteChannel).rotation = obstacle.pRotation
  217.       sprite(currentSpriteChannel).locZ = obstacle.pLocz + obstaclestart
  218.       currentSpriteChannel = currentSpriteChannel + 1
  219.     end if
  220.   end repeat
  221.   i = currentSpriteChannel
  222.   repeat while i <= lastObstacleSprite
  223.     set the loc of sprite i to gOffscreen
  224.     i = 1 + i
  225.   end repeat
  226.   currentSpriteChannel = lastObstacleSprite + 1
  227.   oilDropList = pCollisionGrid.getItems(#oil, screenrect)
  228.   repeat with oilDrop in oilDropList
  229.     if currentSpriteChannel <= pLastSprite then
  230.       set the loc of sprite currentSpriteChannel to oilDrop.ploc - origin
  231.       currentSpriteChannel = currentSpriteChannel + 1
  232.     end if
  233.   end repeat
  234.   i = currentSpriteChannel
  235.   repeat while i <= pLastSprite
  236.     set the loc of sprite i to gOffscreen
  237.     i = 1 + i
  238.   end repeat
  239. end
  240.  
  241. on addOilDrop me, theloc
  242.   oilDrop = [#pRect: rect(theloc - point(25, 26), theloc + point(25, 26)), #ploc: theloc, #endTime: the milliSeconds + 20000]
  243.   pCollisionGrid.addItem(#oil, oilDrop[#pRect], oilDrop)
  244. end
  245.